package com.curricula.usuario.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.curricula.curriculum.dao.Conexion;
import com.curricula.usuario.dao.UsuarioDAO;
import com.curricula.usuario.vo.UsuarioVO;
/**
 * Servicios utilizados para la l�gica de altas bajas y cambios de los usuarios.
 * 
 * @author Carlos
 * @version 1.0 
 */
public class UsuarioService {
	static Logger log = Logger.getLogger(UsuarioService.class);
	
	/**
	 * Busca todos los usurios que coinciden con el filtro que se pasa como parametro
	 * regresa el usuario se utiliza para el inicio de sesion y saber el tipo de usuario
	 * 
	 * @author Carlos
	 * @param UsuarioVO usuarioVO
	 * @return UsuarioVO
	 * @throws SQLException 
	 */
	public static UsuarioVO busca(UsuarioVO usuarioVO)throws SQLException{
		List<UsuarioVO> lista = new ArrayList<UsuarioVO>();
		UsuarioVO encontrado = new UsuarioVO();
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			lista = UsuarioDAO.find(usuarioVO, conn);
			if(lista== null)
				encontrado = null;
			else
				encontrado = (UsuarioVO)lista.get(0);
		}catch(SQLException e){
			encontrado = null;
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}
			}
		}
		return encontrado;
	}
	
	/**
	 * Se registra un nuevo usuario utilizando como parametros de insert
	 * el nick el password y el tipo de usurio que sera considerado como el perfil
	 * 
	 * @author Carlos
	 * @param UsuarioVO usuarioVO
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean alta(UsuarioVO usuarioVO)throws SQLException{
		boolean insertado = false;
		
		UsuarioVO buscar = new UsuarioVO();
		buscar.setUsrNick(usuarioVO.getUsrNick());
		
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			if(UsuarioDAO.find(buscar, conn)== null)
				if(UsuarioDAO.insert(usuarioVO, conn))
					insertado = true;
			else
				insertado = false;		
			conn.commit();
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			try {
				log.warn("Realizando Rollback");
				conn.rollback();
			} catch (SQLException e1) {
				log.error("Error de SQL: "+ e1);
				throw e1;
			}
			throw e;
		}finally{
			if(conn!= null){
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}
			}
		}
		return insertado;		
	}
	
	/**
	 * Elimina la cuenta - registro de un usuario se toma como filtro el UsuarioVO
	 * que llega como parametro para eliminar.
	 * 
	 * @author Carlos
	 * @param UsuarioVO usuarioVO
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean baja(UsuarioVO usuarioVO)throws SQLException{
		boolean eliminado = false;
		Connection conn =null;
		try {
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			eliminado = UsuarioDAO.delete(usuarioVO, conn);
			conn.commit();			
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			try {
				log.warn("Realizando Rollback");
				conn.rollback();
			} catch (SQLException e1) {
				log.error("Error de SQL: "+ e1);
				throw e1;
			}
			throw e;
		}finally{
				if(conn!=null)
					try {
						conn.close();
					} catch (SQLException e1) {
						log.error("Error al cerrar la conexion: "+ e1);
					}
			}					
		return eliminado;
	}
	
	/**
	 * Modifica el registro de un usuario cambiando la informacion algun campo
	 * de la informacion con la que cuenta actualmente.
	 * 
	 * @author Carlos
	 * @param UsuarioVO usuarioVO
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean cambio(UsuarioVO usuarioVO)throws SQLException{
		boolean actualizado = false;
		UsuarioVO buscar = new UsuarioVO();
		buscar.setUsrNick(usuarioVO.getUsrNick());
		List<UsuarioVO> listaUsuarios=new ArrayList<UsuarioVO>();
		boolean flag=true;
		Connection conn = null;
		try {
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);

			listaUsuarios=UsuarioDAO.find(buscar, conn);
			if(listaUsuarios!=null)
			{
				buscar=null;
				buscar=listaUsuarios.get(0);
				if(buscar.getUsrId()!=usuarioVO.getUsrId())
					flag=false;
			}

			if(flag)
			{
				UsuarioDAO.update(usuarioVO, conn);
				actualizado = true;
			}
			else
				actualizado = false;
			conn.commit();			
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			try {
				log.warn("Realizando Rollback");
				conn.rollback();
			} catch (SQLException e1) {
				log.error("Error de SQL: "+ e1);
				throw e1;
			}
			throw e;
		}finally{
			if(conn!= null){
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}
			}
		}		
		return actualizado;
	}
	
	/**
	 * Consulta todos los usurios que cumplen con determinado perfil que es tomado
	 * en cuenta como el parametro que llega como filtro, como puede ocurrir que exista
	 * mas de un usuario que cumpla con los detalles del filtro se regresa una lista 
	 * con todos los usuarios.
	 * 
	 * @author Carlos
	 * @param UsuarioVO usuarioVO
	 * @return List<UsuarioVO>
	 * @throws SQLException 
	 */
	public static List<UsuarioVO> consulta(UsuarioVO usuarioVO)throws SQLException{
		Connection conn = null;		
		List<UsuarioVO> listaUsuarios = null;	
		try{	
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			listaUsuarios = UsuarioDAO.find(usuarioVO,conn);
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			try {
				log.warn("Realizando Rollback");
				conn.rollback();
			} catch (SQLException e1) {
				log.error("Error de SQL: "+ e1);
				throw e1;
			}
			throw e;
		}finally{
			if(conn != null){
				try { conn.close(); } catch (Exception e) {}
			}
		}
		return listaUsuarios;
	}
}